/* 
 * File:   newfile.hpp
 * Author: Ana Paula
 *
 * Created on 2 de Julho de 2011, 14:49
 */

#ifndef NEWFILE_HPP
#define	NEWFILE_HPP

#include <string>
#include "Tabuleiro.hpp"
#include "Jogador.hpp"


namespace jogodavelharedes {

    class Jogo {

    public:

        //Atributos
        Jogador* jogador1;
        Jogador* jogador2;

        //Tabuleiro do jogo
        Tabuleiro* tabuleiro;
        
        //se e ou nao a vez do jogador 1
        bool vezDoJogador1;

        //Numero de jogadas em uma partida
        int contaJogadas;
        
        //Numero de partidas empatadas
        int contaEmpates;

        //Se e ou nao o fim do jogo
        bool fimDoJogo;
        
        //Jogador que venceu o jogo
        Jogador* vencedor;

        /**
         * Define um JOGO.
         * \param jogador1 O jogador 1.
         * \param jogador2 O jogador 2.
	 */
        Jogo(Jogador* jogador1, Jogador* jagador2);

        /**
         * Destrutor
	 */
        ~Jogo();

        /**
	 * Inicia o jogo.
	 */
        void iniciar();

        /**
	 * Retorna o jogador que esta na vez de jogar.
	 * \return Retorna o jogador da vez
         */
        Jogador* jogadorDaVez();

        /**
	 * Realiza a jogada.
         */
        std::string* performJogada();

        /**
	 * Verifica se uma determinada jogada e valida ou nao.
	 * \param linha A linha do tabuleiro.
         * \param coluna A coluna do tabuleiro.
         */
        bool ehJogadaValida(int linha, int coluna);

        /**
	 * Efetiva uma jogada e retorna o simbolo do jogador que jogou.
	 * \param linha A linha do tabuleiro.
         * \param coluna A coluna do tabuleiro.
         */
        char fazerJogada(int linha, int coluna);

        /**
	 * Verifica o vencedor do jogo.
         */
        void verificaVencedor();

       /**
	* Verifica se o jogo terminou e define o vencedor ou empate.
        * Verifica as linhas.
        * Verifica as colunas.
        * Verifica as diagonais.
        */
        bool verificaFimDoJogo();

        /**
	 * Verifica se houve um vencedor no jogo.
        */
        bool houveVencedor();

        /**
	 * Zera o numero de partidas empatadas.
         */
        void zeraEmpates();

        /**
	 * Retorna o vencedor do jogo
         * \return Retorna o vencedor do jogo.
         */
        bool isFimDoJogo();

        /**
	 * Verifica o vencedor do jogo.
         * \return Retorna o vencedor do jogo.
         */
        Jogador* getVencedor();

        /**
	 * Verifica o tabuleiro do jogo.
         * \return Retorna o tabuleiro do jogo.
         */
        Tabuleiro* getTabuleiro();

        /**
	 * Verifica o primeiro jogador.
         * @return Retorna o jogador 1 do jogo.
         */
        Jogador* getJogador1();

        /**
	 * Verifica o segundo jogador.
         * @return Retorna o jogador 2 do jogo.
         */
        Jogador* getJogador2();

        /**
	 * Verifica o numero de empates do jogo.
         * \return Retorna o numero de empates do jogo.
         */
        int getContaEmpates();

    };
}

#endif	/* NEWFILE_HPP */

